package epoch.game.core.util;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * JSON序列化和反序列化
 */
public class JsonUtil {

    /**
     * JSON序列化
     *
     * @param object 传入对象
     * @return String
     */
    public static String toJSONString(Object object) {
	return JSON.toJSONString(object);
    }

    /**
     * JSON序列化(默认写入类型名称)
     *
     * @param object 传入对象
     * @return String
     */
    public static String toJSONStringWriteClassName(Object object) {
	return JSON.toJSONString(object, new SerializerFeature[] { SerializerFeature.WriteClassName, SerializerFeature.DisableCircularReferenceDetect });
    }

    /**
     * JSON序列化时间(默认格式yyyy-MM-dd HH:mm:ss)
     *
     * @param dateTime 传入时间
     * @return String
     */
    public static String toJSONStringWithDateFormat(long dateTime) {
    	Date date = new Date(dateTime);
    	return toJSONStringWithDateFormat(date);
    }

    /**
     * JSON序列化时间(自定义格式)
     *
     * @param dateTime 传入时间
     * @return String
     */
    public static String toJSONStringWithDateFormat(long dateTime, String dateFormat) {
	return JSON.toJSONStringWithDateFormat(dateTime, dateFormat);
    }

    /**
     * JSON序列化时间(默认格式yyyy-MM-dd HH:mm:ss)
     *
     * @param date 传入时间结构
     * @return String
     */
    public static String toJSONStringWithDateFormat(Date date) {
	return JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss", new SerializerFeature[] { SerializerFeature.WriteDateUseDateFormat });
    }
    
    /**
     * JSON序列化时间(自定义格式)
     *
     * @param date 传入时间结构
     * @return String
     */
    public static String toJSONStringWithDateFormat(Date date, String dateFormat) {
	return JSON.toJSONStringWithDateFormat(date, dateFormat, new SerializerFeature[] { SerializerFeature.WriteDateUseDateFormat });
    }

    /**
     * JSON反序列化
     *
     * @param text 传入被反序列化的对象
     * @return Object
     */
    public static Object parse(String text) {
	return JSON.parse(text);
    }

    /**
     * JSON反序列化
     *
     * @param text 传入被反序列化的对象
     * @param clazz 要被反序列化成的类型
     * @return <T extends Object> T
     */
    public static <T extends Object> T parseObject(String text, Class<T> clazz) {
	return (T) JSON.parseObject(text, clazz);
    }

    /**
     * JSON反序列化(强制转化为T类型)
     *
     * @param text 传入被反序列化的对象
     * @param types 要被反序列化成的类型
     * @return <T extends Object> T
     */
    public static <T extends Object> T parseObject(String text, TypeReference<T> type) {
	return (T) JSON.parseObject(text, type);
    }

    /**
     * JSON反序列化(反序列化为List)
     *
     * @param text 传入被反序列化的对象
     * @param clazz 要被反序列化成的类型
     * @return <T extends Object> List<T>
     */
    public static <T extends Object> List<T> parseArray(String text, Class<T> clazz) {
	return (List<T>) JSON.parseArray(text, clazz);
    }

    /**
     * JSON反序列化(反序列化为List) Type[] types = new Type[] {String.class, Byte.class};
     *
     * @param text 传入被反序列化的对象
     * @param types 要被反序列化成的类型数组(可多个类型，按照顺序反序列化)
     * @return List<Object>
     */
    public static List<Object> parseArray(String text, Type[] types) {
	return JSON.parseArray(text, types);
    }

   
}



